package com.winning.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;


/**
 * 日期时间工具类
 */
@Slf4j
public class DateUtil {

    /**
     * 检查字符串是否符合日期格式
     *
     * @param dateStr     要校验的字符串
     * @param datePattern 校验格式
     * @return boolean
     * @author Administrator
     * @date 2019/1/28
     */
    public static boolean isValidDate(String dateStr, String datePattern) {
        DateFormat dateFormat = new SimpleDateFormat(datePattern);
        try {
            //采用严格的解析方式，防止类似 “2017-05-35” 类型的字符串通过
            dateFormat.setLenient(false);
            dateFormat.parse(dateStr);
            Date date = dateFormat.parse(dateStr);
            //重复比对一下，防止类似 “2017-5-15” 类型的字符串通过
            String newDateStr = dateFormat.format(date);
            if (dateStr.equals(newDateStr)) {
                return true;
            } else {
                log.debug("字符串dateStr:{}， 不是严格的 datePattern:{} 格式的字符串", dateStr, datePattern);
                return false;
            }
        } catch (ParseException e) {
            log.debug("字符串dateStr:{}，不能按照 datePattern:{} 样式转换", dateStr, datePattern);
            return false;
        }
    }


    /**
     * 将JSON对象中的日期格式字符串装换成日期类型
     *
     * @param jsonObject  需要装换的JSON对象,依赖com.alibaba.fastjson包
     * @param datePattern 转换格式
     * @return com.alibaba.fastjson.JSONObject
     * @author Administrator
     * @date 2019/1/28
     */
    public static JSONObject formatJsonDate(JSONObject jsonObject, String datePattern) {

        for (Map.Entry<String, Object> set : jsonObject.entrySet()) {
            if (DateUtil.isValidDate(jsonObject.getString(set.getKey()), datePattern)) {
                jsonObject.put(set.getKey(), jsonObject.getDate(set.getKey()));
            }
        }
        return jsonObject;
    }

    /**
     * 将日期装换成指固定定格式字符串
     *
     * @param d           要进行转换的日期
     * @param datePattern 转换格式
     * @return java.lang.String 指定格式字符串类型日期
     * @author z_dd@winning.com.cn
     * @date 2019/2/14 9:39
     */
    public static String dateFormatString(Date d, String datePattern) {

        SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
        dateFormat.setLenient(false);
        return dateFormat.format(d);
    }

    /**
     * 将字符串转换成数据库日期
     *
     * @param sd
     * @return java.sql.Timestamp
     */
    public static java.sql.Timestamp stringFormatDate(String sd) {
        SimpleDateFormat dateFormat = null;
        java.sql.Timestamp date = null;

        try {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            date = new java.sql.Timestamp(dateFormat.parse(sd).getTime());
            return date;
        } catch (ParseException e) {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            try {
                date = new java.sql.Timestamp(dateFormat.parse(sd).getTime());
            } catch (ParseException e1) {
                e1.printStackTrace();
            }
        }
        return date;
    }

}
